package com.campus.commons.utils;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.NoArgsConstructor;


import java.util.HashMap;


import java.util.List;
import java.util.Map;

@Data
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
/**
 * 统一的结果处理类；
 * @Authors  一行琉璃 And  琪亚娜
 */
public class Result<T> {
    private static Integer CodeSuccess=0;
    private static Integer CodeError=1;
    private Integer total;
    private Integer count;
    public void setTotal(Integer total) {
        this.total = total;
        this.count=total;
    }
    /**
     * 响应状态
     * 0 成功 1失败 设置的时候只要设置了 code;
     */
    private Boolean success;
    private Integer code;
    /**
     * 响应信息
     */
    private String msg;
    private Error error;
    /**
     * 响应数据
     */
    private T data;
    public void setCode(Integer code) {
        this.code = code;
        this.success = (code.intValue() == CodeSuccess);
    }
    /**
     * 执行成功；
     *
     * @return
     */
    public static Result success() {
        Result  result = new Result();
        result.setCode(CodeSuccess);
        return result;
    }

    /**
     * 成功并返回数据；没有返回条数
     *
     * @param Data
     * @return
     */
    public static Result success(Object Data) {
        Result result=success();
        result.setData(Data);
        return result;
    }

    /**
     * 成功返回数据；加总条数
     *
     * @param Data
     * @param total
     * @return
     */
    public static Result success(Object Data, Integer total) {
        Result success = success(Data);
        success.setTotal(total);
        return success;
    }

    /**
     * 返回错误状态；没有附带数据
     * @return
     */
    public static Result error() {
        Result result = new Result();
        result.setCode(CodeError);
        return result;
    }

    /**
     * 返回错误信息 ；并携带数据
     * @param error
     * @param data
     * @return
     */
    public static Result error(Error error, Object data) {
        Result result = error();
        result.setData(data);
        result.setError(error);
        return result;
    }

    /**
     * 根据传入的结果值判断是否成功； data 返回受影响行数;
     * @param res
     * @return
     */
    public static Result result(int res) {
        if (res == 0) {
            return error(Error.System, null);
        }
        return success(res);
    }

    /**
     * 根据传入的结果值判断是否成功； data 返回受影响行数;
     * @param res
     * @return
     */
    public static Result result(boolean res) {
        return result(res ? 1 : 0);
    }

    /**
     * 通过传入的集合；返回是否查询出结果
     *
     * @param list
     * @return
     */
    public static Result result(List list) {
        if (list == null || list.size() == 0) {
//            return success(Error.SYSTEM_E2R, "没有获取到任何数据");
        }
        return success(list);
    }

    /**
     * 通过传入的集合；返回是否查询出结果
     *
     * @param page
     * @return
     */
    public static Result result(Page page) {
        return success(page.getRecords(), (int) page.getTotal());
    }


    /**
     * 批量操作的Result 结果
     */
    public static Result<Map<String, Object>> result(Integer total, Integer succeed) {
        Map<String, Object> map = new HashMap<>();
        map.put("succeed", succeed);
        map.put("total", total);
        map.put("fail", (total - succeed));
     return Result.success(map);
    }



    /**
     *  通常用于查询Id返回一个对象； 判断这个对象是否存在，来返回响应的数据
     * @param object 返回的对象
     * @return 存在return 成功， 否则失败
     */
    public static Result verify(Object object) {
        if (object == null) {
            return Result.error(Error.Operation_E1R, "没有相关数据");
        }
        return Result.success(object);
    }




}

